NLP 传统分词与大模型 Tokenization 的本质区别

从分词到 Token:NLP 传统分词与大模型 Tokenization 的本质区别

同样是"把文本切成小块",传统分词和大模型 tokenization 走的是两条完全不同的路。

引子

如果你用过 jieba 分词,也用过 ChatGPT,你可能会有一个疑问:它们都在"切文本",到底有什么不同?

答案是:目标不同,一切就不同。

传统分词追求的是语言学正确性——切出来的每一块都应该是一个有意义的词。而大模型的 tokenization 追求的是编码效率——用尽可能少的 token 表示尽可能多的文本,同时保持词表规模可控。

这篇文章会从原理、方法、效果三个层面拆解两者的区别。

一、传统 NLP 分词:让人看懂文本结构

要解决什么问题?

英文有天然的空格作为词边界,但中文没有。"南京市长江大桥"到底是"南京市 / 长江大桥"还是"南京 / 市长 / 江大桥"?这就是中文分词要解决的核心问题——找到正确的词边界

主流方法

基于词典的方法:维护一个大词典,用最大匹配等策略扫描文本。简单快速,但碰到新词就无能为力。

基于统计的方法:把分词建模为序列标注问题,用 HMM、CRF 等模型学习字与字之间的转移概率。jieba 分词就是这类方法的代表,它结合了词典和 HMM 来处理未登录词。

基于深度学习的方法:用 BiLSTM+CRF 等模型做序列标注,效果更好,但计算成本也更高。

一个例子

输入:"我在北京大学学习自然语言处理"
输出:["我", "在", "北京大学", "学习", "自然语言处理"]

每个切分结果都是一个语言学意义上的词,人类读起来完全自然。

痛点

二、大模型 Tokenization:让模型高效吃进文本

要解决什么问题?

大模型需要把任意文本转换成一个整数序列作为输入。如果以字符为单位,序列太长,计算成本爆炸;如果以词为单位,词表太大,且无法处理拼写错误和新词。

Tokenization 的目标是在序列长度词表大小之间找到最优平衡点。

主流算法

BPE(Byte Pair Encoding):GPT 系列的选择。从字符级别开始,反复合并语料中最高频的相邻 token 对,直到词表达到预设大小。本质上是一种数据压缩算法。

WordPiece:BERT 的选择。与 BPE 类似,但合并策略不同——它选择合并后能最大化语言模型似然的 token 对,而非单纯看频率。

Unigram:SentencePiece 支持的方法。反向操作——从一个大词表开始,逐步移除对整体编码效率影响最小的 token,直到词表缩减到目标大小。

SentencePiece:不是一种算法,而是一个框架。它直接在原始文本上训练(不依赖预分词),支持 BPE 和 Unigram,天然适合多语言场景。

一个例子

输入:"unhappiness"

BPE 风格:["un", "happi", "ness"]
词表中没有 "unhappiness" 这个完整的词,但子词组合可以表示它。

输入:"自然语言处理"

可能的结果:["自然", "语言", "处", "理"]
"自然"和"语言"在训练语料中频率够高,被保留为完整 token;
"处理"频率不够,被拆成了两个单字 token。

注意:切出来的片段不一定是"词",甚至不一定有独立含义。这完全没问题——模型不需要每个 token 都有语言学意义。

三、核心区别一览

维度 传统分词 大模型 Tokenization
目标 语言学正确的词边界 高效压缩文本为模型输入
基本单位 子词(subword)
方法论 词典 + 规则 + 序列标注 BPE / WordPiece / Unigram
未登录词处理 困难,需要特殊策略 天然支持,拆成更小单元即可
语言依赖性 强,通常需要语言专属工具 弱,统一框架处理多语言
词表规模 可能很大(数十万) 固定且可控(32k ~ 150k)
输出可读性 较低,可能出现碎片
错误容忍度 低,切错影响下游任务 高,模型通过上下文学习语义

四、一个有趣的现象:为什么中文更费 token?

如果你用过 OpenAI 的 Tokenizer 工具,你会发现同样语义的内容,中文消耗的 token 数通常是英文的 1.5 到 2 倍。

原因很直接:GPT 系列模型的训练语料以英文为主,英文的常见词和子词在 BPE 合并过程中被充分压缩,一个 token 可以表示一个完整的常见单词。而中文字符出现频率相对低,很多词无法被合并为单个 token,只能拆成单字甚至字节级别的 token。

这也是为什么针对中文优化的模型(如 ChatGLM、Qwen)会专门扩充中文 token 的词表——让常见中文词也能被一个 token 表示,从而降低序列长度,提升推理效率。

五、它们之间有交集吗?

有。在一些大模型的 tokenizer 实现中,会先做一轮"预分词"(pre-tokenization),用正则或简单规则把文本粗切成块,然后再对每个块做 BPE。这一步的作用类似传统分词,但目的不是语言学正确性,而是防止 BPE 跨越不合理的边界(比如把空格和单词合并成一个 token)。

另外,一些中文大模型会在 tokenizer 训练前先用分词工具处理语料,让 BPE 更容易学到有意义的中文子词。这算是传统分词技术在大模型时代的一种延续。

总结

传统分词和大模型 tokenization 看似做着相同的事,实则服务于完全不同的目标:

理解这个区别,你就能明白为什么大模型不需要专门的"分词"步骤,为什么中文比英文更费 token,以及为什么 tokenizer 的设计对模型性能有着深远的影响。

下次当你看到 GPT 把"人工智能"切成 ["人工", "智", "能"] 的时候,不要觉得它"切错了"——它只是在用自己的方式理解这个世界。